/*
 * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.lang.reflect;

/**
 * InvocationTargetException 是一个受检异常，用于包装由被调用的方法或构造器抛出的异常。
 *
 * <p>从 1.4 版本开始，此异常已被改造以符合通用异常链机制。
 * 在构造时提供并通过 {@link #getTargetException()} 方法访问的"目标异常"
 * 现在被称为<i>原因</i>，可以通过 {@link Throwable#getCause()} 方法访问，
 * 也可以通过前述的"遗留方法"访问。
 *
 * @see Method
 * @see Constructor
 */
public class InvocationTargetException extends ReflectiveOperationException {
    /**
     * Use serialVersionUID from JDK 1.1.X for interoperability
     */
    private static final long serialVersionUID = 4085088731926701167L;

     /**
     * 如果使用 InvocationTargetException(Throwable target) 构造函数
     * 来实例化对象，此字段保存目标异常。
     *
     * @serial
     *
     */
    private Throwable target;

    /**
     * 构造一个以 {@code null} 作为目标异常的 {@code InvocationTargetException}。
     */
    protected InvocationTargetException() {
        super((Throwable)null);  // Disallow initCause
    }

    /**
     * 构造一个带有目标异常的 InvocationTargetException。
     *
     * @param target 目标异常
     */
    public InvocationTargetException(Throwable target) {
        super((Throwable)null);  // Disallow initCause
        this.target = target;
    }

    /**
     * 构造一个带有目标异常和详细消息的 InvocationTargetException。
     *
     * @param target 目标异常
     * @param s      详细消息
     */
    public InvocationTargetException(Throwable target, String s) {
        super(s, null);  // Disallow initCause
        this.target = target;
    }

    /**
     * 获取抛出的目标异常。
     *
     * <p>此方法早于通用异常链机制。
     * {@link Throwable#getCause()} 方法现在是获取此信息的首选方式。
     *
     * @return 抛出的目标异常（此异常的原因）
     */
    public Throwable getTargetException() {
        return target;
    }

    /**
     * 返回此异常的原因（抛出的目标异常，可能为 {@code null}）。
     *
     * @return  此异常的原因
     * @since   1.4
     */
    public Throwable getCause() {
        return target;
    }
}
